package com.liwalo.action;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.struts2.ServletActionContext;

import com.liwalo.dao.DatosEnvioDAO;
import com.liwalo.dao.MediosContactoDAO;
import com.liwalo.dao.PedidoDAO;
import com.liwalo.dao.ProductosPedidoDAO;
import com.liwalo.dao.UsuarioDAO;
import com.liwalo.entities.Ciudad;
import com.liwalo.entities.DatosEnvio;
import com.liwalo.entities.DatosFacturacion;
import com.liwalo.entities.DatosPago;
import com.liwalo.entities.ListadoCiudad;
import com.liwalo.entities.ListadoPais;
import com.liwalo.entities.ListadoProv;
import com.liwalo.entities.MediosContacto;
import com.liwalo.entities.Pais;
import com.liwalo.entities.Pedido;
import com.liwalo.entities.ProductosPedido;
import com.liwalo.entities.TipoEnvio;
import com.liwalo.entities.TipoPago;
import com.liwalo.entities.TipoVia;
import com.liwalo.entities.Usuario;
import com.liwalo.utils.URLUtils;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class PagoTarjeta extends ActionSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = -92756624251082845L;
	
	private int idref;
	
	private String nombre;
	private String telefono;
	private String direccion;
	private int provincia;
	private int pais;
	private String apellidos;
	private String email;
	private int ciudad;
	private String codigoPostal;
	private int tipovia;
	
	
	private String nombref;
	private String telefonof;
	private String direccionf;
	private int provinciaf;
	private int paisf;
	private String apellidosf;
	private String emailf;
	private int ciudadf;
	private String codigoPostalf;
	private int tipoviaf;
	
	private String formapago;
	private int facturacionc;
	private double totalprecioiva;
	
	private String custom;
	
	private String url;
	private String returnOk;
	private String returnCancel;
	
	private MediosContacto medios;
	private Usuario user;
	
	
	
	public String execute() throws Exception {
		
		Map parameters = ActionContext.getContext().getParameters();
		Map session = ActionContext.getContext().getSession();
		java.util.Date fechaActual = new java.util.Date(); 
		
		Properties properties = new Properties();
		properties.load(getClass().getClassLoader().getResourceAsStream("paypal.properties"));
		url = properties.getProperty("url", "https://www.sandbox.paypal.com/cgi-bin/webscr");
		returnOk = URLUtils.getPaypalURL(ServletActionContext.getRequest())+"/liwalo/PagoPaypalSave";
		returnCancel = URLUtils.getPaypalURL(ServletActionContext.getRequest())+"/liwalo/PagoSeleccion";
		
		System.out.println("Action  ... PagoTarjeta .... parameters :"+parameters);
		System.out.println(" ------------------CUSTOM : "+getCustom());
		
		Usuario usuariovo= new Usuario();
		Pedido pedidovo= new Pedido();
		ProductosPedido prodpedidovo = new ProductosPedido();
		DatosFacturacion datosfacvo=new DatosFacturacion();
		DatosPago datospagovo=new DatosPago();
		DatosEnvio datosenviovo=new DatosEnvio();
		TipoPago tipopagovo=new TipoPago();
		TipoEnvio tipoenviovo=new TipoEnvio();
		List<ProductosPedido> listadocarrito= new ArrayList<ProductosPedido>();
		
		UsuarioDAO usuarioDao=new UsuarioDAO();
		MediosContactoDAO mediosDao=new MediosContactoDAO();
		PedidoDAO pedidoDao=new PedidoDAO();
		
		
		
		//Generamos los datos de las pais, provincia , ciudad , tipovia
		TipoVia tipoviavo=new TipoVia();
		ListadoPais listapais=new ListadoPais();
		ListadoCiudad listaciudad=new ListadoCiudad();
		ListadoProv listaprov=new ListadoProv();
		
		
		listapais.setId(1);

		
		
		//obtenemos el listado del carrito de compras
		listadocarrito=(List<ProductosPedido>) session.get("listadocarrito");
		usuariovo=(Usuario)session.get("usuario");
		
		
		
		
		//Metemos los datos de facturacion si la facturacion es 0 , no son los mismos datos del usuario y se capturan
		
		if(facturacionc==0){
			
			listaciudad.setId(ciudadf);
			listaprov.setId(provinciaf);
			tipoviavo.setId(tipoviaf);
			
			datosfacvo.setApellidos(apellidosf);
			datosfacvo.setCp(String.valueOf(codigoPostalf));
			datosfacvo.setTipoViaId(tipoviavo);
			datosfacvo.setDireccion(direccionf);
			datosfacvo.setListadoCiudadId(listaciudad);
			datosfacvo.setListadoPaisId(listapais);
			datosfacvo.setListadoProvId(listaprov);
			datosfacvo.setNombre(nombref);
			datosfacvo.setCp(codigoPostalf);
			

			
			datosenviovo.setApellidos(apellidosf);
			datosenviovo.setCp(codigoPostalf);
			datosenviovo.setDireccion(direccionf);
			datosenviovo.setEmail(emailf);
			datosenviovo.setNombre(nombref);
			datosenviovo.setTelefono(telefonof);
			datosenviovo.setListadoCiudadId(listaciudad);
			datosenviovo.setListadoPaisId(listapais);
			datosenviovo.setListadoProvId(listaprov);			
			datosenviovo.setTipoViaId(tipoviavo);
			
			
		}else{
			
			
			listaciudad.setId(ciudad);
			listaprov.setId(provincia);
			tipoviavo.setId(tipovia);
			
			datosfacvo.setApellidos(apellidos);
			datosfacvo.setCp(String.valueOf(codigoPostal));
			datosfacvo.setDireccion(direccion);
			datosfacvo.setListadoCiudadId(listaciudad);
			datosfacvo.setListadoPaisId(listapais);
			datosfacvo.setListadoProvId(listaprov);
			datosfacvo.setNombre(nombre);
			datosfacvo.setCp(codigoPostal);
			datosfacvo.setTipoViaId(tipoviavo);
			
			datosenviovo.setApellidos(apellidos);
			datosenviovo.setCp(codigoPostal);
			datosenviovo.setDireccion(direccion);
			datosenviovo.setEmail(email);
			datosenviovo.setNombre(nombre);
			datosenviovo.setTelefono(telefono);
			datosenviovo.setListadoCiudadId(listaciudad);
			datosenviovo.setListadoPaisId(listapais);
			datosenviovo.setListadoProvId(listaprov);
			datosenviovo.setTipoViaId(tipoviavo);
			user=usuariovo;
			
		}
		MediosContacto mediosvo=new MediosContacto();
		mediosvo.setCp(codigoPostal);
		mediosvo.setDireccion(direccion);
		mediosvo.setEstado(1);
		mediosvo.setListadoCiudadId(listaciudad);
		mediosvo.setListadoPaisId(listapais);
		mediosvo.setListadoProvId(listaprov);
		mediosvo.setTelefono(telefono);
		mediosvo.setTimestamp(fechaActual);
		mediosvo.setTipoViaId(tipoviavo);
		
		//Verificamos si el usuario es invitado y si es invitado lo guardamos en BBDD
		if( ("Invitado").equals(usuariovo.getNombre()) ){
			
			
			Usuario userinvitado= new Usuario();
		
			
			List<MediosContacto> listamedios=new ArrayList<MediosContacto>();
			
			
			userinvitado.setNombre(nombre);
			userinvitado.setEmail(email);
			userinvitado.setEstado(1);
			userinvitado.setFecha(fechaActual);
			//userinvitado.setMediosContactoList(listamedios);
			userinvitado.setApellidos(apellidos);
			userinvitado.setContrasena("000000");
			userinvitado.setNif(String.valueOf(session.get("userName")));
			
			
			//Guardamos el usuario invitado
			usuarioDao.persist(userinvitado);
			
			
			
			session.put("usuario", userinvitado);
			usuariovo=userinvitado;
			user=usuariovo;
		
		}
		
		//Guardamos o actualizamos los datos
		mediosvo.setUsuarioId(usuariovo);
		mediosDao.attachDirty(mediosvo);
		medios=mediosDao.findById(mediosvo.getId());

		//Generamos el numero de pedido
		Long idpedido= pedidoDao.formIdPedido();
		
		//Tipo de pago Paypal
		tipopagovo.setId(1);
		tipopagovo.setDescripcion("paypal");
		
		//Tipo de envio por ahora default a domicilio
		tipoenviovo.setId(1);
		
		
		//pedidovo.setId(idpedido);
		pedidovo.setUsuarioId(usuariovo);
		pedidovo.setGastosEnvio(7); //falta de ver de donde sacarlo
		pedidovo.setPrecioTotal(totalprecioiva);
		pedidovo.setEmailEnviado(0); //falta
		pedidovo.setNumeroPedido(idpedido); 
		//pedidovo.setProductosPedidoList(listadocarrito);
		pedidovo.setTipoPagoId(tipopagovo);
		pedidovo.setTipoEnvioId(tipoenviovo);
		pedidovo.setDatosFacturacionId(datosfacvo);
		pedidovo.setDatosPagoId(datospagovo);
		pedidovo.setTipoEnvioId(tipoenviovo);
		pedidovo.setTipoPagoId(tipopagovo);
		pedidovo.setTokenCancelacion("");
		pedidovo.setTimestamp(fechaActual);
		pedidovo.setDatosEnvioId(datosenviovo);
		
		//guardamos en session pedido
		
		session.put("pedido", pedidovo);
		
		
		return SUCCESS;
	}
	
	
	public String pagoTarjetaCredito() throws Exception {
		Map session = ActionContext.getContext().getSession();
		//session.remove("listadocarrito");
		
		return SUCCESS;
	}


	public String getNombre() {
		return nombre;
	}


	public void setNombre(String nombre) {
		this.nombre = nombre;
	}


	

	public String getDireccion() {
		return direccion;
	}


	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}


	


	public String getApellidos() {
		return apellidos;
	}


	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}


	public String getEmail() {
		return email;
	}


	public void setEmail(String email) {
		this.email = email;
	}



	


	public String getNombref() {
		return nombref;
	}


	public void setNombref(String nombref) {
		this.nombref = nombref;
	}


	
	public String getDireccionf() {
		return direccionf;
	}


	public void setDireccionf(String direccionf) {
		this.direccionf = direccionf;
	}


	

	public String getApellidosf() {
		return apellidosf;
	}


	public void setApellidosf(String apellidosf) {
		this.apellidosf = apellidosf;
	}


	public String getEmailf() {
		return emailf;
	}


	public void setEmailf(String emailf) {
		this.emailf = emailf;
	}



	public String getCodigoPostal() {
		return codigoPostal;
	}


	public void setCodigoPostal(String codigoPostal) {
		this.codigoPostal = codigoPostal;
	}


	public String getCodigoPostalf() {
		return codigoPostalf;
	}


	public void setCodigoPostalf(String codigoPostalf) {
		this.codigoPostalf = codigoPostalf;
	}


	public String getFormapago() {
		return formapago;
	}


	public void setFormapago(String formapago) {
		this.formapago = formapago;
	}




	public int getFacturacionc() {
		return facturacionc;
	}


	public void setFacturacionc(int facturacionc) {
		this.facturacionc = facturacionc;
	}


	public int getIdref() {
		return idref;
	}


	public void setIdref(int idref) {
		this.idref = idref;
	}


	public double getTotalprecioiva() {
		return totalprecioiva;
	}


	public void setTotalprecioiva(double totalprecioiva) {
		this.totalprecioiva = totalprecioiva;
	}


	public String getCustom() {
		return custom;
	}


	public void setCustom(String custom) {
		this.custom = custom;
	}


	public String getTelefono() {
		return telefono;
	}


	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}


	public String getTelefonof() {
		return telefonof;
	}


	public void setTelefonof(String telefonof) {
		this.telefonof = telefonof;
	}


	public int getTipovia() {
		return tipovia;
	}


	public void setTipovia(int tipovia) {
		this.tipovia = tipovia;
	}


	public int getTipoviaf() {
		return tipoviaf;
	}


	public void setTipoviaf(int tipoviaf) {
		this.tipoviaf = tipoviaf;
	}


	public int getProvincia() {
		return provincia;
	}


	public void setProvincia(int provincia) {
		this.provincia = provincia;
	}


	public int getPais() {
		return pais;
	}


	public void setPais(int pais) {
		this.pais = pais;
	}


	public int getCiudad() {
		return ciudad;
	}


	public void setCiudad(int ciudad) {
		this.ciudad = ciudad;
	}


	public int getProvinciaf() {
		return provinciaf;
	}


	public void setProvinciaf(int provinciaf) {
		this.provinciaf = provinciaf;
	}


	public int getPaisf() {
		return paisf;
	}


	public void setPaisf(int paisf) {
		this.paisf = paisf;
	}


	public int getCiudadf() {
		return ciudadf;
	}


	public void setCiudadf(int ciudadf) {
		this.ciudadf = ciudadf;
	}


	public String getUrl() {
		return url;
	}


	public void setUrl(String url) {
		this.url = url;
	}


	public String getReturnOk() {
		return returnOk;
	}


	public void setReturnOk(String returnOk) {
		this.returnOk = returnOk;
	}


	public String getReturnCancel() {
		return returnCancel;
	}


	public void setReturnCancel(String returnCancel) {
		this.returnCancel = returnCancel;
	}


	public MediosContacto getMedios() {
		return medios;
	}


	public void setMedios(MediosContacto medios) {
		this.medios = medios;
	}


	public Usuario getUser() {
		return user;
	}


	public void setUser(Usuario user) {
		this.user = user;
	}
	
	
	
	

}
